import axios from "axios";
import router from '../router'; // 导入路由实例
import { Message } from 'element-ui';

// 测试
let baseURLs = 'https://api.sc123.shop/'

let isShowingLoginExpired = false;
let loginExpiredTimer = null;

const request = axios.create({
    //测试
    baseURL: baseURLs,
    timeout: 40000
})

// 请求拦截器
request.interceptors.request.use(
    config => {
        const token = localStorage.getItem('token');
        // console.log('请求拦截器 - URL:', config.url);
        // console.log('请求拦截器 - 当前token:', token);
        
        // 特殊处理文件上传请求，删除Content-Type让浏览器自动设置
        if (config.data instanceof FormData) {
            delete config.headers['Content-Type'];
        }
        
        if (token) {
            // 移除可能存在的 Bearer 前缀，然后重新添加
            const cleanToken = token.replace(/^Bearer\s+/i, '');
            config.headers['Authorization'] = `Bearer ${cleanToken}`;
            // console.log('请求拦截器 - 设置Authorization头:', `Bearer ${cleanToken}`);
        } else {
            console.warn('请求拦截器 - 未找到token');
        }
        return config;
    },
    error => {
        console.error('请求拦截器 - 错误:', error);
        Message.error('请求发送失败');
        return Promise.reject(error);
    }
);

// 处理登录过期的函数
const handleLoginExpired = (message) => {
    if (!isShowingLoginExpired) {
        isShowingLoginExpired = true;
        
        // 清除之前的定时器
        if (loginExpiredTimer) {
            clearTimeout(loginExpiredTimer);
        }
        
        // 显示错误消息
        Message.error(message || '登录已过期，请重新登录');
        
        // 清除所有认证信息
        localStorage.removeItem('token');
        localStorage.removeItem('user');
        localStorage.removeItem('isLoggedIn');
        
        // 设置定时器，延迟跳转并重置标志位
        loginExpiredTimer = setTimeout(() => {
            router.push('/login');
            // 重置标志位
            setTimeout(() => {
                isShowingLoginExpired = false;
            }, 2000);
        }, 1500);
    }
};

// 响应拦截器
request.interceptors.response.use(
    response => {
        const res = response.data;
        console.log('响应拦截器 - URL:', response.config.url);
        console.log('响应拦截器 - 状态码:', response.status);
        console.log('响应拦截器 - 响应数据:', res);
        
        // 如果是登录请求，直接返回响应，让组件处理错误信息
        if (response.config.url.includes('/login')) {
            return response;
        }
        
        // 如果响应成功，直接返回
        const successCodes = [200, '200', 0, '0'];
        if (successCodes.includes(res.code)) {
            return response;
        }
        
        // 处理业务错误
        if (res.code === 401) {
            handleLoginExpired(res.message);
            return Promise.reject({
                handled: true,
                message: res.message || '登录已过期'
            });
        }
        
        // 其他业务错误 - 不在这里显示错误消息，让组件处理
        return Promise.reject({
            handled: true,
            message: res.msg || res.message || '请求失败',
            code: res.code
        });
    },
    error => {
        console.error('响应拦截器 - 错误:', error);
        console.error('响应拦截器 - 错误响应:', error.response);
        
        // 如果是登录请求，直接返回错误，让组件处理错误信息
        if (error.config.url.includes('/login')) {
            return Promise.reject(error);
        }
        
        if (error.response) {
            const res = error.response.data;
            console.log('响应拦截器 - 错误数据:', res);
            
            switch (error.response.status) {
                case 401:
                    console.log('响应拦截器 - 401错误，当前URL:', error.config.url);
                    handleLoginExpired(res.message);
                    return Promise.reject({
                        handled: true,
                        message: res.message || '登录已过期'
                    });
                case 403:
                    Message.error('没有权限访问该资源');
                    return Promise.reject({
                        handled: true,
                        message: '没有权限访问该资源'
                    });
                case 404:
                    Message.error('请求的资源不存在');
                    return Promise.reject({
                        handled: true,
                        message: '请求的资源不存在'
                    });
                case 500:
                    // Message.error('服务器错误，请稍后重试');
                    return Promise.reject({
                        // handled: true,
                        // message: '服务器错误，请稍后重试'
                    });
                default:
                    Message.error(res?.message || '发生错误，请稍后重试');
                    return Promise.reject({
                        handled: true,
                        message: res?.message || '发生错误，请稍后重试'
                    });
            }
        }
        Message.error('网络错误，请检查您的网络连接');
        return Promise.reject({
            handled: true,
            message: '网络错误，请检查您的网络连接'
        });
    }
);

export default request
export {
    baseURLs
}